/**
 * @description 通过函数改造后，如果返回第一个参数不为空时，说明该请求报错，就可以提前 return 出去，如果不存在第一个参数时，则异步请求成功。目的是丢掉冗余的 try-catch
 * @param { Promise } promise
 * @param { Object= } errorExt - Additional Information you can pass to the err object
 * @example // 获取列表list
   const [err, data] = await to(getList(params))
   if (err) return
   // 获取单个详情
   const info = await to(getListById(list[0]?.id))
 * @return { Promise }
 */
export function flatAwait<T, U = Error>(
  promise: Promise<T>,
  errorExt?: object
): Promise<[U, undefined] | [null, T]> {
  return promise
    .then<[null, T]>((data: T) => [null, data])
    .catch<[U, undefined]>((err: U) => {
      if (errorExt) {
        const parsedError = Object.assign({}, err, errorExt)
        return [parsedError, undefined]
      }

      return [err, undefined]
    })
}
